package com.shell.customer.trade.service.impl;

import com.shell.bee.acct.AcctTxService;
import com.shell.bee.acct.transaction.po.AcctTxRec;
import com.shell.bee.base.exception.UnCheckException;
import com.shell.bee.base.service.BaseService;
import com.shell.customer.chain.service.ChainTxService;
import com.shell.customer.trade.service.TradeService;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service("tradeService")
public class TradeServiceImpl extends BaseService implements TradeService {
	@Autowired
	private ChainTxService chainTxService;
	@Autowired
	private AcctTxService acctTxService;

	public Map<String, String> fire(AcctTxRec tx) {
		Map<String, String> result = null;
		try {
			this.acctTxService.tri(tx);
			if (isChainTx(tx)) {
				result = this.chainTxService.fire(tx);
			}
		} catch (Exception e) {
			result = new HashMap();
			result.put("ret_code", "U");
			result.put("ret_msg", e.getMessage());
			this.logger.error("��������������������", e);
		}
		return result;
	}

	public Map<String, String> fire(String txSn, List<AcctTxRec> txs) {
		Map<String, String> result = null;
		try {
			if ((txs != null) && (txs.size() > 0)) {
				this.acctTxService.tri(txs);
				if (isChainTx((AcctTxRec) txs.get(0))) {
					result = this.chainTxService.fire(txSn, txs);
				}
			}
		} catch (Exception e) {
			throw new UnCheckException("��������������������", e);
		}
		return result;
	}

	public void callback(AcctTxRec tran) {
		amtModify(tran);
		this.acctTxService.confirm(tran);
	}

	public void callback(List<AcctTxRec> txs) {
		for (AcctTxRec tx : txs) {
			callback(tx);
		}
	}

	public void rollback(AcctTxRec tran) {
		this.acctTxService.cancel(tran);
	}

	public void rollback(List<AcctTxRec> txs) {
		for (AcctTxRec tx : txs) {
			rollback(tx);
		}
	}

	private void amtModify(AcctTxRec tx) {
		String optType = tx.getOptType();
		BigDecimal txAmt = tx.getTxAmt();
		BigDecimal tranAmt = new BigDecimal(0);
		BigDecimal txTotAmt = new BigDecimal(0);
		BigDecimal blkAmt = new BigDecimal(0);
		BigDecimal cpTotAmt = new BigDecimal(0);
		switch (optType) {
		case "qt_snd":
			tranAmt = new BigDecimal(0).subtract(txAmt);
			txTotAmt = new BigDecimal(0).subtract(txAmt);
			break;
		case "qt_rec":
			tranAmt = txAmt;
			txTotAmt = txAmt;
			break;
		case "qt_inc":
			tranAmt = txAmt;
			cpTotAmt = txAmt;
			break;
		case "qt_red":
			tranAmt = txAmt;
			txTotAmt = txAmt;
			break;
		case "qt_blk":
			blkAmt = new BigDecimal(0).subtract(txAmt);
			break;
		case "qt_ubk":
			blkAmt = txAmt;
			break;
		case "qt_use":
			tranAmt = txAmt;
			blkAmt = txAmt;
			cpTotAmt = txAmt;
			break;
		case "qt_res":
			tranAmt = txAmt;
			txTotAmt = txAmt;
			break;
		case "qt_trd":
			tranAmt = txAmt;
			txTotAmt = txAmt;
			cpTotAmt = txAmt;
			break;
		case "qt_wtd":
			tranAmt = txAmt;
			blkAmt = txAmt;
			txTotAmt = txAmt;
			break;
		case "qt_u_t":
			tranAmt = txAmt;
			blkAmt = txAmt;
			txTotAmt = txAmt;
			cpTotAmt = txAmt;
			break;
		}
		tx.setTranAmt(tranAmt);
		tx.setBlkAmt(blkAmt);
		tx.setTxTotAmt(txTotAmt);

		tx.setCpTotAmt(cpTotAmt);
	}

	private boolean isChainTx(AcctTxRec tx) {
		return "C".equals(tx.getTxChnCode());
	}
}
